GradleでXcodeプロジェクトをビルド/テスト
概要
Gradleのプラグインで、XcodeのiOSビルドとかを補助するものがあった。
https://github.com/openbakery/gradle-xcodePlugin
その簡単な使い方を見つつ、発展系として
TestFlightに放り込んだり、
先のUnityビルドとの連携を試してみたり、
超願望としてはCocoaPodsと連携させてみたい。
サンプルプロジェクトはgithubにあげておいた。
https://github.com/sassembla/Gradle_XcodeSample
手順と読者想定
iOSでのアプリ作りとかしたことあるような前提で書いてます。
Xcodeで新規プロジェクトを作成、UnitTestとか適当に全部のせ、みたいなところに、
Gradleでの一般的なビルドスタイルとして build.gradle ファイルをプロジェクトフォルダに置いた、という地点からのスタート。
手始めにSimulator用ビルド
プロジェクトフォルダ直下のbuild.gradleを編集。
build.gradle
buildscript {
repositories {
maven {
url('http://openbakery.org/repository/')
//url uri('/tmp/repo')
}
mavenCentral()
}
dependencies {
classpath group: 'org.openbakery', name: 'xcodePlugin', version: '0.6.+'
}
}
apply plugin: 'xcode'
buildscript {
configurations.classpath.resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
xcodebuild {
sdk = 'iphonesimulator'
target = 'Gradle_XcodeSample'
}
特に解説がいらないんじゃないかな的な気もするくらい、簡単なビルドスクリプト。
で、Terminalでgradle xcodebuild とか実行すると、
Simulatorでのビルド、成功!。
Simulatorでのtest
前提として、下記を満たしている必要がある。
・テスト対象は、Xcodeで作ったOCTestUnitのコード
・テスト用のbundleがある
みためでいうとこんな感じ。
で、OCUnitをコマンドラインから実行するために、TEST HOST のパラメータを空にする。
理由はおまけで後述
で、build.gradleの設定を調整する。
xcodebuild タスクの中に1行追加
build.gradle
xcodebuild {
sdk = 'iphonesimulator'
target = 'Gradle_XcodeSample'
unitTestTarget = 'Gradle_XcodeSampleTests'
}
これで、xcodebuild実行時に、unitTestTargetで指定したターゲットに含まれるOCUnitTestが実行される。
試しに実行すると、一件のテストが失敗する。
通常のGradleの動作だと、テストが成功したり失敗したりしたリストがxmlファイルとして生成されるのだけれど、
このプラグインにはまだその出力機構は無い模様。
ちなみに自作はかんたんな筈です。
Deviceでのビルド
魅力を感じないのでパス。
Deviceでのテスト
あまり魅力を感じないのでやはりパス
Xcodeつないでるとき以外やんないでしょ。
Testflightとの連携
また今度。
おまけ
なんでSimulatorでTestする際、Test Host 項目を空にするのか
Xcodeをインストールすると使える Xcodebuildコマンドで、OCUnitの実行は出来る。
んだけど、
xcodebuild -configuration Debug -sdk iphonesimulator -target Gradle_XcodeSampleTests TEST_AFTER_BUILD=YES DSTROOT=/Users/sassembla/Desktop/Gradle_XcodeSample/build/dst OBJROOT=/Users/sassembla/Desktop/Gradle_XcodeSample/build/obj SYMROOT=/Users/sassembla/Desktop/Gradle_XcodeSample/build/sym SHARED_PRECOMPS_DIR=/Users/sassembla/Desktop/Gradle_XcodeSample/build/shared
とか実行しようとすると、
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/Tools/RunPlatformUnitTests:81:
warning: Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set).
って言われて、テストがスキップされてしまう。
ようは、SimulatorでTestする場合、TEST_HOSTのパラメータに何かセットしてあると、サポートしてないんでスキップするぜ、っていうことだった。
デフォルトで、このパラメータはプロジェクト自体のパスが入っている。
で、上でやったように、このTEST_HOST項目を空にすることでテストがスキップされずにちゃんと実行されるよ、ということ。